package dao;

import java.util.List;
import model.Acao;
import model.Usuario;
import org.hibernate.Session;
import util.CustomException;

public class AcaoDAO extends GenericEntityDAO<Acao, Long> {

    public List<Acao> selecionarPermissao(Session session, Usuario usuario) throws CustomException {
        try {
            StringBuilder sbHQL = new StringBuilder();
            sbHQL.append(" SELECT AC");
            sbHQL.append("   FROM Acao AC");
            sbHQL.append("  WHERE (SELECT COUNT(*)");
            sbHQL.append("            FROM UsuarioAcao USA,");
            sbHQL.append("                 Usuario USU");
            sbHQL.append("           WHERE USA.acao.acaoCodigo = AC.acaoCodigo");
            sbHQL.append("             AND USU.usuCodigo = USA.usuario.usuCodigo");
            sbHQL.append("             AND USU.usuCodigo = :usuCodigo");
            sbHQL.append("             AND USA.usaPermissao = true");
            sbHQL.append("             AND USU.usuPermissaoPorGrupo = false) > 0");
            sbHQL.append("      OR (SELECT COUNT(*)");
            sbHQL.append("            FROM UsuarioGrupoAcao UGA,");
            sbHQL.append("                 UsuarioGrupo UGR,");
            sbHQL.append("                 Usuario USU");
            sbHQL.append("           WHERE UGA.acao.acaoCodigo = AC.acaoCodigo");
            sbHQL.append("             AND UGR.ugrCodigo = UGA.usuarioGrupo.ugrCodigo");
            sbHQL.append("             AND USU.usuarioGrupo.ugrCodigo = UGR.ugrCodigo");
            sbHQL.append("             AND USU.usuCodigo = :usuCodigo");
            sbHQL.append("             AND UGA.ugaPermissao = true");
            sbHQL.append("             AND USU.usuPermissaoPorGrupo = true) > 0");

            return session.createQuery(sbHQL.toString()).setLong("usuCodigo", usuario.getUsuCodigo()).list();
        } catch (Exception e) {
            throw new CustomException("Falha ao selecionar permissões do usuário.", e);
        }
    }
}
